/*
 * Utente.java
 *
 * Created on 15 de Maio de 2007, 10:55
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package pt.iscte.dcti.es.rhplus.utilizador;

import java.util.Date;
import java.sql.SQLException;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedList;

import pt.iscte.dcti.es.rhplus.sistema.CodigoPostal;

/**
 * 
 * @author Gustavo Cabral
 * @author Helena Monteiro
 * @author Joao Catarino
 * @author Tiago Moreiras
 */
public abstract class Utente extends Pessoa {

	/** Creates a new instance of Utente */
	public Utente(final int id_pessoa, final String nome, final char sexo, final int bi, final Date data_de_nascimento, final int nif,
			final String email, final int telefone, final int telemovel, final String morada, final String grupo_sanguineo,
			final CodigoPostal codigo_postal, final LinkedList<TratamentoPassado> lista_de_tratamentos_passados,
			LinkedList<DoencaPassada> lista_de_doencas_passadas) {

		super(id_pessoa, nome, sexo, bi, data_de_nascimento, nif, email, telefone, telemovel, morada, grupo_sanguineo, codigo_postal);

		this.lista_de_tratamentos_passados = lista_de_tratamentos_passados;
		this.lista_de_doencas_passadas = lista_de_doencas_passadas;
	}

	public boolean temTratamentosPassados() {
		return !this.lista_de_tratamentos_passados.isEmpty();
	}

	public LinkedList<TratamentoPassado> getListaDeTratamentosPassados() {
		return lista_de_tratamentos_passados;
	}

	public TratamentoPassado getTratamentoPassado(final int id_tratamento_passado) {
		// Procura o tratamento passado associado ao identificador.
		Iterator<TratamentoPassado> iterator = lista_de_tratamentos_passados.iterator();
		while (iterator.hasNext()) {
			TratamentoPassado tratamento_passado = iterator.next();
			if (tratamento_passado.equals(id_tratamento_passado))
				return tratamento_passado;
		}

		// Se o TratamentoPassado nao foi encontrado devolve null.
		return null;
	}

	public void adicionaTratamentoPassado(final Hashtable<String, Object> dados) throws SQLException, ClassNotFoundException, InstantiationException,
			IllegalAccessException {
		// Inserir na base de dados.
		TratamentoPassado.insere(dados);

		// Adiciona a instancia do objecto.
		int ultimo_id_inserido = TratamentoPassado.devolveUltimoIdentificadorDeInsercao();
		TratamentoPassado tratamento_passado = TratamentoPassado.devolve(ultimo_id_inserido);
		this.lista_de_tratamentos_passados.add(tratamento_passado);
	}

	public void alteraTratamentoPassado(final Hashtable<String, Object> dados) throws SQLException, ClassNotFoundException, InstantiationException,
			IllegalAccessException {
		// Procura a instancia do objecto.
		int id_tratamento_passado = ((Integer) dados.get("var_id_tratamento_passado"));
		TratamentoPassado tratamento_passado = TratamentoPassado.devolve(id_tratamento_passado);

		// Altera o objecto.
		tratamento_passado.setDescricao((String) dados.get("var_descricao"));
		tratamento_passado.setObservacao((String) dados.get("var_observacao"));

		// Invoca o metodo gravaParaBaseDeDados para gravar o objecto.
		tratamento_passado.gravaParaBaseDeDados();
	}

	public void removeTratamentoPassado(final int id_tratamento_passado) throws SQLException, ClassNotFoundException, InstantiationException,
			IllegalAccessException {
		// Remove da instancia do objecto
		Iterator<TratamentoPassado> iterator = lista_de_tratamentos_passados.iterator();
		boolean encontrou_tratamento_passado = false;
		while (iterator.hasNext() && !encontrou_tratamento_passado) {
			if (iterator.next().equals(id_tratamento_passado)) {
				iterator.remove();
				encontrou_tratamento_passado = true;
			}
		}

		// Remove do local de persistencia
		TratamentoPassado.remove(id_tratamento_passado);
	}

	public boolean temDoencasPassadas() {
		return !this.lista_de_doencas_passadas.isEmpty();
	}

	public LinkedList<DoencaPassada> getListaDeDoencasPassadas() {
		return lista_de_doencas_passadas;
	}

	public DoencaPassada getDoencaPassada(final int id_doenca_passada) {
		// Procura a doenca passada associada ao identificador.
		Iterator<DoencaPassada> iterator = lista_de_doencas_passadas.iterator();
		while (iterator.hasNext()) {
			DoencaPassada doenca_passada = iterator.next();
			if (doenca_passada.equals(id_doenca_passada))
				return doenca_passada;
		}

		// Se a DoencaPassada nao foi encontrada devolve null.
		return null;
	}

	public void adicionaDoencaPassada(final Hashtable<String, Object> dados) throws SQLException, ClassNotFoundException, InstantiationException,
			IllegalAccessException {
		// Inserir na base de dados.
		DoencaPassada.insere(dados);

		// Adiciona a instancia do objecto.
		int ultimo_id_inserido = DoencaPassada.devolveUltimoIdentificadorDeInsercao();
		DoencaPassada doenca_passada = DoencaPassada.devolve(ultimo_id_inserido);

		this.lista_de_doencas_passadas.add(doenca_passada);
	}

	public void alteraDoencaPassada(final Hashtable<String, Object> dados) throws SQLException, ClassNotFoundException, InstantiationException,
			IllegalAccessException {
		// Procura a instancia do objecto.
		int id_doenca_passada = ((Integer) dados.get("var_id_doenca_passada"));
		DoencaPassada doenca_passada = DoencaPassada.devolve(id_doenca_passada);

		// Altera o objecto.
		doenca_passada.setSintomas((String) dados.get("var_sintomas"));
		doenca_passada.setTratamento((String) dados.get("var_tratamento"));

		// Invoca o metodo gravaParaBaseDeDados para gravar o objecto.
		doenca_passada.gravaParaBaseDeDados();
	}

	public void removeDoencaPassada(final int id_doenca_passada) throws SQLException, ClassNotFoundException, InstantiationException,
			IllegalAccessException {

		// Remove da instancia do objecto
		Iterator<DoencaPassada> iterator = lista_de_doencas_passadas.iterator();
		boolean encontrou_doenca_passada = false;
		while (iterator.hasNext() && !encontrou_doenca_passada) {
			if (iterator.next().equals(id_doenca_passada)) {
				iterator.remove();
				encontrou_doenca_passada = true;
			}
		}

		// Remove do local de persist�ncia
		DoencaPassada.remove(id_doenca_passada);
	}

	public void gravaParaBaseDeDados() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
		super.gravaParaBaseDeDados();
	}

	@Override
	public String toString() {
		String utente_em_string = super.toString();

		if (temTratamentosPassados()) {
			utente_em_string += "\nLista De Tratamentos Passados";
			for (TratamentoPassado tratamento : lista_de_tratamentos_passados)
				utente_em_string += "\n" + tratamento;
		} else
			utente_em_string += "\nNao existem registos de tratamentos passados.";

		if (temDoencasPassadas()) {
			utente_em_string += "\nLista De Doencas Passadas";
			for (DoencaPassada doenca : lista_de_doencas_passadas)
				utente_em_string += "\n" + doenca;
		} else
			utente_em_string += "\nN�o existem registos de doencas passadas.";

		return utente_em_string;
	}

	protected LinkedList<TratamentoPassado> lista_de_tratamentos_passados;
	protected LinkedList<DoencaPassada> lista_de_doencas_passadas;
}
